/*
 * Ant Group
 * Copyright (c) 2004-2024 All Rights Reserved.
 */
package com.alipay.zmdepositdemo.model;

import com.alipay.api.domain.ExtendParams;
import com.alipay.api.domain.GoodsDetail;
import com.alipay.api.domain.PromoParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

import java.io.Serializable;
import java.util.List;

/**
 * @author zhangjian
 * @version TradeDeductModel.java, v 0.1 2024年07月04日 14:45 zhangjian
 */
@ApiModel(description = "交易扣款模型")
public class TradeDeductModel implements Serializable {

    private static final long serialVersionUID = 4288492628162924341L;

    /**
     * 商户订单号
     * 由商家自定义，64个字符以内，仅支持字母、数字、下划线且需保证在商户端不重复。
     */
    @ApiModelProperty(value = "商户订单号", example = "out_trade_no20240701010101001", required = true)
    private String outTradeNo;

    /**
     * 订单总金额
     * 单位为元，精确到小数点后两位，取值范围：[0.01,100000000]。
     */
    @ApiModelProperty(value = "订单总金额", example = "12.34", required = true)
    private String totalAmount;

    /**
     * 订单标题
     * 注意：不可使用特殊字符，如 /，=，& 等。
     */
    @ApiModelProperty(value = "订单标题", example = "XX租车租金", required = true)
    private String subject;

    /**
     * 商家和支付宝签约的产品码
     * 芝麻免押产品固定传PREAUTH_PAY
     */
    @ApiModelProperty(value = "签约产品码", example = "PREAUTH_PAY", required = true)
    private String productCode;

    /**
     * 资金预授权单号
     * 支付宝预授权和新当面资金授权场景下必填
     */
    @ApiModelProperty(value = "资金预授权单号", example = "2016110310002001760201905725", required = false)
    private String authNo;

    /**
     * 预授权确认模式
     * 适用于支付宝预授权和新当面资金授权场景。枚举值：
     * COMPLETE：转交易完成后解冻剩余冻结金额；
     * NOT_COMPLETE：转交易完成后不解冻剩余冻结金额；
     * 默认值为NOT_COMPLETE。
     */
    @ApiModelProperty(value = "预授权确认模式", example = "NOT_COMPLETE", required = false)
    private String authConfirmMode;

    /**
     * 订单包含的商品列表信息
     * json格式
     */
    @ApiModelProperty(value = "订单包含的商品列表信息", required = false)
    private List<GoodsDetail> goodsDetail;

    /**
     * 业务扩展参数
     * 二级参数字段会动态新增
     */
    @ApiModelProperty(value = "业务扩展参数", required = false)
    private ExtendParams extendParams;

    /**
     * 优惠明细参数
     * 通过此属性补充营销参数
     */
    @ApiModelProperty(value = "优惠明细参数", example = "12.34", required = false)
    private PromoParam promoParams;

    /**
     * 商户门店编号
     * 指商户创建门店时输入的门店编号
     */
    @ApiModelProperty(value = "商户门店编号", example = "NJ_001", required = false)
    private String storeId;

    /**
     * 商户机具终端编号
     */
    @ApiModelProperty(value = "商户机具终端编号", example = "NJ_T_001", required = false)
    private String terminalId;

    /**
     * 返回参数选项。
     * 商户通过传递该参数来定制同步需要额外返回的信息字段，数组格式。
     * 包括但不限于：
     * ["fund_bill_list","voucher_detail_list","enterprise_pay_info","discount_goods_detail","discount_amount","mdiscount_amount"]
     */
    @ApiModelProperty(value = "返回参数选项", example = "[\"voucher_detail_list\"]", required = false)
    private List<String> queryOptions;

    /**
     * Getter method for property <tt>outTradeNo</tt>.
     *
     * @return property value of outTradeNo
     */
    public String getOutTradeNo() {
        return outTradeNo;
    }

    /**
     * Setter method for property <tt>outTradeNo</tt>.
     *
     * @param outTradeNo value to be assigned to property outTradeNo
     */
    public void setOutTradeNo(String outTradeNo) {
        this.outTradeNo = outTradeNo;
    }

    /**
     * Getter method for property <tt>totalAmount</tt>.
     *
     * @return property value of totalAmount
     */
    public String getTotalAmount() {
        return totalAmount;
    }

    /**
     * Setter method for property <tt>totalAmount</tt>.
     *
     * @param totalAmount value to be assigned to property totalAmount
     */
    public void setTotalAmount(String totalAmount) {
        this.totalAmount = totalAmount;
    }

    /**
     * Getter method for property <tt>subject</tt>.
     *
     * @return property value of subject
     */
    public String getSubject() {
        return subject;
    }

    /**
     * Setter method for property <tt>subject</tt>.
     *
     * @param subject value to be assigned to property subject
     */
    public void setSubject(String subject) {
        this.subject = subject;
    }

    /**
     * Getter method for property <tt>productCode</tt>.
     *
     * @return property value of productCode
     */
    public String getProductCode() {
        return productCode;
    }

    /**
     * Setter method for property <tt>productCode</tt>.
     *
     * @param productCode value to be assigned to property productCode
     */
    public void setProductCode(String productCode) {
        this.productCode = productCode;
    }

    /**
     * Getter method for property <tt>authNo</tt>.
     *
     * @return property value of authNo
     */
    public String getAuthNo() {
        return authNo;
    }

    /**
     * Setter method for property <tt>authNo</tt>.
     *
     * @param authNo value to be assigned to property authNo
     */
    public void setAuthNo(String authNo) {
        this.authNo = authNo;
    }

    /**
     * Getter method for property <tt>authConfirmMode</tt>.
     *
     * @return property value of authConfirmMode
     */
    public String getAuthConfirmMode() {
        return authConfirmMode;
    }

    /**
     * Setter method for property <tt>authConfirmMode</tt>.
     *
     * @param authConfirmMode value to be assigned to property authConfirmMode
     */
    public void setAuthConfirmMode(String authConfirmMode) {
        this.authConfirmMode = authConfirmMode;
    }

    /**
     * Getter method for property <tt>goodsDetail</tt>.
     *
     * @return property value of goodsDetail
     */
    public List<GoodsDetail> getGoodsDetail() {
        return goodsDetail;
    }

    /**
     * Setter method for property <tt>goodsDetail</tt>.
     *
     * @param goodsDetail value to be assigned to property goodsDetail
     */
    public void setGoodsDetail(List<GoodsDetail> goodsDetail) {
        this.goodsDetail = goodsDetail;
    }

    /**
     * Getter method for property <tt>extendParams</tt>.
     *
     * @return property value of extendParams
     */
    public ExtendParams getExtendParams() {
        return extendParams;
    }

    /**
     * Setter method for property <tt>extendParams</tt>.
     *
     * @param extendParams value to be assigned to property extendParams
     */
    public void setExtendParams(ExtendParams extendParams) {
        this.extendParams = extendParams;
    }

    /**
     * Getter method for property <tt>promoParams</tt>.
     *
     * @return property value of promoParams
     */
    public PromoParam getPromoParams() {
        return promoParams;
    }

    /**
     * Setter method for property <tt>promoParams</tt>.
     *
     * @param promoParams value to be assigned to property promoParams
     */
    public void setPromoParams(PromoParam promoParams) {
        this.promoParams = promoParams;
    }

    /**
     * Getter method for property <tt>storeId</tt>.
     *
     * @return property value of storeId
     */
    public String getStoreId() {
        return storeId;
    }

    /**
     * Setter method for property <tt>storeId</tt>.
     *
     * @param storeId value to be assigned to property storeId
     */
    public void setStoreId(String storeId) {
        this.storeId = storeId;
    }

    /**
     * Getter method for property <tt>terminalId</tt>.
     *
     * @return property value of terminalId
     */
    public String getTerminalId() {
        return terminalId;
    }

    /**
     * Setter method for property <tt>terminalId</tt>.
     *
     * @param terminalId value to be assigned to property terminalId
     */
    public void setTerminalId(String terminalId) {
        this.terminalId = terminalId;
    }

    /**
     * Getter method for property <tt>queryOptions</tt>.
     *
     * @return property value of queryOptions
     */
    public List<String> getQueryOptions() {
        return queryOptions;
    }

    /**
     * Setter method for property <tt>queryOptions</tt>.
     *
     * @param queryOptions value to be assigned to property queryOptions
     */
    public void setQueryOptions(List<String> queryOptions) {
        this.queryOptions = queryOptions;
    }
}